﻿#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/*******************21.⾃定义类型：联合和枚举******************/
/*1. 联合体*/
/*像结构体⼀样，联合体也是由⼀个或者多个成员构成，这些成员可以不同的类型。
但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所
以联合体也叫：共⽤体。
给联合体其中⼀个成员赋值，其他成员的值也跟着变化。*/

//结构体
//struct s
//{
//	int i;
//	char c;
//};//8个字节
//
////联合体
//union Un
//{
//	int i;
//	char c;
//};
//
////联合的成员是共⽤同⼀块内存空间的，这样⼀个联合变量的⼤⼩，⾄少是最⼤成员的⼤⼩（因为联合
////⾄少得有能⼒保存最⼤的那个成员）。
//int main()
//{
//	union Un n;
//	n.i = 0x11223344;
//	n.c = 0x55; //联合体修改一个另一个也会改变
//
//	printf("%zd\n",sizeof(n));
//	printf("%p\n", &n);
//	printf("%p\n", &(n.i));
//	printf("%p\n", &(n.c));
//
//	return 0;
//}

/*联合体大小*/
/*联合的⼤⼩⾄少是最⼤成员的⼤⼩。
当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候，就要对⻬到最⼤对⻬数的整数倍。*/

//union un
//{
//	char arr[5];
//	int n;
//};
//
//int main()
//{
//	printf("%d\n",sizeof(union un));//8
//	return 0;
//}

//写一个程序判断大小端

//int check_sys()
//{
//	union Un
//	{
//		char c;
//		int i;
//	};
//	union Un u = {0};
//	u.i = 1;
//	return u.c;
//	
//}
//
//int main()
//{
//	if (check_sys())
//		printf("小端\n");
//	else
//		printf("大端\n");
//
//	return 0;
//}

//使⽤联合体是可以节省空间的，举例
/*⽐如，我们要搞⼀个活动，要上线⼀个礼品兑换单，礼品兑换单中有三种商品：图书、杯⼦、衬衫。
每⼀种商品都有：库存量、价格、商品类型和商品类型相关的其他信息。*/

//struct gift_list
//{
//	int stock_number;//库存量
//	double price; //定价
//	int item_type;//商品类型
//	union 
//	{
//		struct
//		{
//			char title[20];//书名
//			char author[20];//作者
//			int num_pages;//⻚数
//		}book;
//		struct
//		{
//			char design[30];//设计
//		}mug;
//		struct
//		{
//			char design[30];//设计
//			int colors;//颜⾊
//			int sizes;//尺⼨
//		}shirt;
//	}item;
//};

/*2. 枚举类型*/
/*枚举顾名思义就是⼀ 列举。
把可能的取值⼀ 列举。*/
//例如：星期⼀到星期⽇，性别，⽉份

enum Sex//性别
{
	//枚举常量
	/*MALE,
	FEMALE,
	SECRET*/
	//可在此处设置初值
	MALE = 2,
	FEMALE = 5,
	SECRET
};

//int main()
//{
//	//MALE = 4; //枚举常量无法修改
//	printf("%d\n", MALE);
//	printf("%d\n", FEMALE);
//	printf("%d\n", SECRET);
//
//	return 0;
//}

//枚举类型的优点
//我们可以使⽤ #define 定义常量，
/*优点*/
//1. 增加代码的可读性和可维护性
//2. 和#define定义的标识符⽐较枚举有类型检查，更加严谨。
//3. 便于调试，预处理阶段会删除 #define 定义的符号
//4. 使⽤⽅便，⼀次可以定义多个常量
//5. 枚举常量是遵循作⽤域规则的，枚举声明在函数内，只能在函数内使⽤